package com.summer.campussct.utils;

import com.summer.campussct.pojo.dto.RestResult;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.UUID;

@Component
public class FileUtil {
    @Value("${file-position.rootPath}")
    private String rootPath;


    @Value("${file-position.server}")
    private String server;

    /**
     * 将临时文件转存
     * @param id 转存目录的唯一标识，如vid、uid
     * @param url 临时文件URL（注意不是服务器目录）
     * @param newPath 指定服务器存储目录前缀，newPath + id 为文件存储目录
     * @return 返回新的URL（服务器地址 + / + newPath + id + / + 文件名）
     */
    public String transferSave(long id, String url, String newPath) {
        // 不是临时文件则不进行转存
        if (!url.contains("temp")){
            return url;
        }
        String tempUri = url.replaceAll(server + "/", "");
        String tempPos = rootPath + tempUri;
        String savePos = rootPath + newPath + id + "/";
        String fileName = save(tempUri, tempPos, savePos);
        return server + "/" + newPath + id + "/" + fileName;
    }

    // 不带唯一标识，目录为newPath
    public String transferSave(String url, String newPath) {
        // 不是临时文件则不进行转存
        if (!url.contains("temp")){
            return url;
        }
        String tempUri = url.replaceAll(server + "/", "");
        String tempPos = rootPath + tempUri;
        String savePos = rootPath + newPath;
        String fileName = save(tempUri, tempPos, savePos);
        return server + "/" + newPath + fileName;
    }

    private String save(String tempUri, String tempPos, String savePos) {
        String fileName = tempUri.substring(tempUri.lastIndexOf("/") + 1);
        try {
            Path sourcePath = Paths.get(tempPos);
            Path targetPath = Paths.get(savePos + fileName);
            // 如果目标目录不存在则创建，已存在则此方法不执行任何操作
            Files.createDirectories(targetPath.getParent());
            Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
        } catch (Exception e) {
            System.err.println("将临时文件转存到指定位置失败");
            e.printStackTrace();
            throw new RuntimeException(e);
        }
        return fileName;
    }


    /**
     * 删除图片服务器中的图片
     * @param url 图片的URL地址
     */
    public void deleteFile(String url) throws IOException {
        String fileUri = url.replaceAll(server + "/", "");
        String filePos = rootPath + fileUri;
        Files.delete(Paths.get(filePos));
    }

    /**
     * 将用户上传的图片保存到文件服务器指定位置
     * @param file 用户上传的file
     * @param destPath 相对路径（如/temp/xxx）
     * @return 返回文件url（localhost.....）
     */
    public String saveToDest(MultipartFile file, String destPath) throws IOException {
        // 获取源文件名
        String fileOriginalFilename = file.getOriginalFilename();
        // 随机生成文件名
        String filename = getFileName(fileOriginalFilename);
        // 存入目的地
        file.transferTo(Paths.get(rootPath + destPath + filename));
        return server + "/" + destPath + filename;
    }

    private String getFileName(String originalFilename) {
        if (originalFilename == null || "".equals(originalFilename)){
            throw new RuntimeException("文件名不存在");
        }
        int index = originalFilename.lastIndexOf(".");
        String extension = "";
        if (index > 0) {
            extension =  originalFilename.substring(index);
        }
        return UUID.randomUUID().toString().replace("-", "") + extension;
    }

}
